package VideoRent.Cliente;

import java.util.*;
import java.io.*;

import VideoRent.Alquiler.*;
import VideoRent.Enum.*;

/**
 * Clase que representa una instancia particular de un cliente asociado a la
 * videotienda
 */
public class ClienteAsociado extends Cliente{
    //Siguiente código disponible para asignar a un cliente asociado nuevo
    private static int siguienteCodigo;
    //Codigo que la videotienda le asocia al cliente
    private String codigo;
    //Dirección de facturación de la tarjeta de crédito
    private String direccionFiscal;
    //Numero de la tarjeta de credito del cliente
    private String numeroTarjeta;
    //Banco al que pertenece la tarjeta de crédito
    private String banco;
    //Codigo de seguridad de la tarjeta de crédito
    private int codigoSeguridad;
    //Fecha de vencimiento de la tarjeta de crédito
    private Calendar fechaVencimiento;
    //Arreglo de alquileres que incluyen las distintas películas que ha alquilado
    //el cliente
    private ArrayList<Alquiler> articulosAlquilados;
    //Estado actual del cliente
    private EstadoCliente estado;
    //Tipo de la membresía del cliente
    private Membresia tipoMembresia;

    /**
     * Constructor de la clase
     * @param cedula Cedula de identidad del cliente
     * @param estado Estado actual del cliente
     * @param nombre Nombre del cliente
     * @param apellido Apellido del cliente
     * @param telefono Telefono de contacto del cliente
     * @param codigo Codigo que la videotienda le asocia al cliente
     * @param direccionFiscal Dirección de facturación de la tarjeta de crédito
     * @param numeroTarjeta Numero de la tarjeta de credito del cliente
     * @param banco Banco al que pertenece la tarjeta de crédito
     * @param codigoSeguridad Codigo de seguridad de la tarjeta de crédito
     * @param fechaVencimiento Fecha de vencimiento de la tarjeta de crédito
     */
    public ClienteAsociado(int cedula, EstadoCliente estado, String nombre, String apellido, int telefono, String codigo, String direccionFiscal,
                           String numeroTarjeta, String banco, int codigoSeguridad, Calendar fechaVencimiento){
        super(cedula, nombre, apellido, telefono);
        this.codigo = codigo;
        this.direccionFiscal = direccionFiscal;
        this.numeroTarjeta = numeroTarjeta;
        this.banco = banco;
        this.codigoSeguridad = codigoSeguridad;
        this.fechaVencimiento = fechaVencimiento;
        this.articulosAlquilados = new ArrayList<Alquiler>();
        this.estado = estado;
        this.tipoMembresia = (codigo.substring(0,1) == "P" ? Membresia.PREMIUM : Membresia.BASICA);
    }

    //Lista de 'getters' para obtener los atributos de la clase

    public String getCodigo(){return this.codigo;}
    public String getDireccionFiscal(){return this.direccionFiscal;}
    public String getNumeroTarjeta(){return this.numeroTarjeta;}
    public String getBanco(){return this.banco;}
    public int getCodigoSeguridad(){return this.codigoSeguridad;}
    public Calendar getFechaVencimiento(){return this.fechaVencimiento;}
    public ArrayList<Alquiler> getArticulosAlquilados(){return this.articulosAlquilados;}
    public static int getSiguienteCodigo(){return ClienteAsociado.siguienteCodigo;}
    public EstadoCliente getEstado(){return this.estado;}
    public Membresia getTipoMembresia(){return this.tipoMembresia;}

    //Lista de 'setters' para asignar los valores de los atributos de la clase

    public void setCodigo(String a){this.codigo = a;}
    public void setDireccionFiscal(String a){this.direccionFiscal = a;}
    public void setNumeroTarjeta(String a){this.numeroTarjeta = a;}
    public void setBanco(String a){this.banco = a;}
    public void setCodigoSeguridad(int a){this.codigoSeguridad = a;}
    public void setFechaVencimiento(Calendar a){this.fechaVencimiento = a;}
    public void setEstado(EstadoCliente a){this.estado = a;}
    public void setArticulosAlquilados(ArrayList<Alquiler> a){this.articulosAlquilados = a;}
    public static void setSiguienteCodigo(int siguienteCodigo){ClienteAsociado.siguienteCodigo = siguienteCodigo;}

    /**
     * Método que actualiza el estado e imprime el resultado a un buffer si es necesario
     * @param escritor Buffer al cual se va a escribir, puede ser null si no se desea escribir
     * @return Valor del estado del cliente despues de la actualización
     */
    public EstadoCliente actualizarEstado(BufferedWriter escritor, Calendar diaActual){
        Calendar limite = (Calendar)diaActual.clone();
        EstadoCliente estadoAnterior = this.estado;
        String mensaje;

        limite.add(Calendar.DAY_OF_MONTH, -35);
        this.estado = limite.before(this.fechaVencimiento) ? EstadoCliente.ACTIVO : EstadoCliente.SUSPENDIDO;

        if((this.estado != estadoAnterior) && (escritor != null)){
            try{
                mensaje = "c & " + this.codigo + " & " + this.estado;
                escritor.write(mensaje, 0, mensaje.length());
                escritor.newLine();
            }catch(IOException e){
                System.out.println("Error al imprimir el cambio de estado: " + e.getMessage());
            }
        }
        return this.estado;
    }


    /**
     * Método que genera una versión imprimible del objeto
     * @return Representación en String del objeto
     */
    public String toString(){
        int mes = getFechaVencimiento().get(Calendar.MONTH);
        return getCodigo() + " & " +
               getEstado() + " & " +
               getCedula() + " & " +
               getNombre() + " & " +
               getApellido() + " & " +
               getTelefono() + " & " +
               getDireccionFiscal() + " & " +
               getNumeroTarjeta() + " & " +
               getBanco() + " & " +
               getCodigoSeguridad() + " & " +
               (10 > mes ? "0" + mes : mes) + "/" + getFechaVencimiento().get(Calendar.YEAR);
    }
}